﻿using System;
using System.Collections.Generic;

namespace CSharp进阶_委托
{
	class Monster
	{
		public int id;
		public int money = 10;
		public Action<Monster> onDead;
		public Monster(int id)
		{
			this.id = id;
			Console.WriteLine("怪物{0}被创建了", id);
		}
		public void Dead()
		{
			if (onDead != null)
			{
				Console.WriteLine("怪物{0}被杀死了", id);
				onDead(this);
			}
		}
	}
	class Player
	{
		public int id;
		public int money;
		public Player(int id)
		{
			this.id = id;
			this.money = 0;
			Console.WriteLine("玩家已被创建");

		}
		public void MonsterDeadDoSomething(Monster m)
		{
			if (m.money > 0)
			{
				this.money += m.money;
				Console.WriteLine("玩家{0}获得了{1}元钱", id, money);
			}
		}
	}
	class Panel
	{
		public int width;
		public int height;
		public int money;
		public Panel(int width, int height, Player player)
		{
			this.width = width;
			this.height = height;
			money = player.money;
			Console.WriteLine("当前界面有{0}元钱", money);
		}
		public void MonsterDeadDoSomething(Monster m)
		{
			money = m.money;
			Console.WriteLine("当前界面有{0}元钱", money);
		}
	}
	class Achievement
	{
		public int MonsterKillCount = 0;
		public void MonsterDeadDoSomething(Monster m)
		{
			MonsterKillCount++;
			Console.WriteLine("当前击杀怪物数{0}", MonsterKillCount);
		}
	}

	class Program
	{
		static void Main(string[] args)
		{ 
			Player player = new Player(1);
			Panel window = new Panel(1024, 768, player);
			Monster monster = new Monster(1);
			Achievement achievement = new Achievement();
			monster.onDead += player.MonsterDeadDoSomething;
			monster.onDead += window.MonsterDeadDoSomething;
			monster.onDead += achievement.MonsterDeadDoSomething;

			monster.Dead();
			monster.onDead = null;
			//Action lunch = () => Console.WriteLine("妈妈做饭");
			//lunch += () => Console.WriteLine("开饭");
			//lunch += () => Console.WriteLine("爸爸妈妈孩子吃饭");
			//lunch();
		} 
	}

			//// 无参无返回值的委托
			//delegate void Func1();
			//delegate void Func2<T, K>(T t, K k);
			//class Base
			//{
			//	public List<Func1> handlers = new List<Func1>();
			//	public Func1 func1;
			//	public Func2<int, string> func2;
			//	public Base(Func1 func1, Func2<int, string> func2)
			//	{
			//		this.func1 = func1;
			//		this.func2 = func2;
			//		func1();
			//		func2(102444, "miku");
			//	}
			//}
			//class Program
			//{
			//	static void Main(string[] args)
			//	{
			//		#region 委托概念
			//		// 定义初始化
			//		//Func1 func1 = new func1(test1);
			//		//func1 += test2;
			//		//func1.invoke();
			//		//func1();

			//		//Func1 func2 = test1;
			//		//func2 += test2;
			//		//func2.invoke();
			//		//func2();

			//		//Func1 func3 = null;
			//		//func3 += test1;
			//		//func3 += test2;
			//		//func3.invoke();
			//		//func3();

			//		//func1 -= test1;
			//		//func1();

			//		#endregion
			//		#region 系统提供的委托
			//		// 1.Action
			//		//Action action1 = Test1;
			//		//action1 += Test2;
			//		//action1.Invoke();
			//		//action1();
			//		//Action<int, string> action2 = (a, b) => Console.WriteLine("Action<int, string> {0}, {1}", a, b);
			//		//action2.Invoke(1024, "hello");
			//		//action2(1024, "hello");
			//		//// 2.Func
			//		//Func<int> func1 = () => 
			//		//	{
			//		//		Console.WriteLine("Func<int> func1 ");
			//		//		return 0;
			//		//	};
			//		//if (func1 != null)
			//		//{
			//		//	func1();
			//		//}
			//		//Func<int, string, int> func2 = (a, b) =>
			//		//	{
			//		//		Console.WriteLine("Func<int, string, int> func2 {0}, {1}", a, b);
			//		//		return a + b.Length;
			//		//	};
			//		//if (func2!= null)
			//		//{
			//		//	func2(10240, "hello");
			//		//}
			//		#endregion
			//		#region 泛型委托
			//		//Func2<int, string> func2 = (a, b) =>
			//		//{
			//		//	Console.WriteLine("Func2<int, string> func3 {0}, {1}", a, b);
			//		//};
			//		//func2 += Test3;
			//		//func2.Invoke(1024, "hello");
			//		//func2(1024, "hello");
			//		#endregion
			//		#region 委托列表
			//		//Func<int> func1 = null;
			//		//func1 += () => {
			//		//	Console.WriteLine("static int Test5()");
			//		//	return 5;
			//		//};
			//		//func1 += () => {
			//		//	Console.WriteLine("static int Test6()");
			//		//	return 6;
			//		//};
			//		//func1 += () => {
			//		//	Console.WriteLine("static int Test7()");
			//		//	return 7;
			//		//};
			//		//Console.WriteLine("{0}\n\n", func1());
			//		//foreach (Func<int> item in func1.GetInvocationList())
			//		//{
			//		//	Console.WriteLine("foreach {0}", item());
			//		//}
			//		#endregion
			//		#region 委托
			//		#endregion
			//		#region 委托
			//		#endregion
			//		#region 委托
			//		#endregion
			//		#region 委托
			//		#endregion
			//	}

			//	static void Test1()
			//	{
			//		Console.WriteLine("static void Test1()");
			//	}
			//	static void Test2()
			//	{
			//		Console.WriteLine("static void Test2()\n\n");
			//	}
			//	static void Test3(int a, string b)
			//	{
			//		Console.WriteLine("static void Test3(int a, string b)");
			//	}
			//	static void Test4(int a, string b)
			//	{
			//		Console.WriteLine("static void Test4(int a, string b)");
			//	}
			//	static int Test5()
			//	{
			//		Console.WriteLine("static int Test5()");
			//		return 5;
			//	}
			//	static int Test6()
			//	{
			//		Console.WriteLine("static int Test6()");
			//		return 6;
			//	}
			//	static int Test7()
			//	{
			//		Console.WriteLine("static int Test7()");
			//		return 7;
			//	}
		//}
}
